<?php
/**
 * @brief Klasa encyjna NetworArc
 * 
 * Obiekty tej klasy reprezentują połaczenia między lokalizacjami w sieci
 * dystrybucji towarów. Połączenia są skierowane.
 * 
 */
class Application_Model_NetworkArc
{
    protected $_NetworkArc_id; /*!< Identyfiaktor połączenia. */
    protected $_predecessor; /*!< Identyfiaktor lokalizacji z której wychodzi połączenie. */
    protected $_predecessorName; /*!< Nazwa lokalizacji z której wychodzi połączenie.*/
    protected $_successor; /*!< Identyfiaktor lokalizacji w której kończy się połączenie*/
    protected $_successorName; /*!< Nazwa lokalizacji w której kończy się połączenie*/
    
    /**
     * @brief Konstruktor 
     * 
     * Przyjmuje tablicę znaków i na jej podstawie uzupełnia pola,
     * przy pomocy setOptions.
     * @param array $options 
     */
    public function __construct(array $options = null) {
        if (is_array($options)) {
            $this->setOptions($options);
        }
    }

    /**
     * @brief Metoda uzupełniająca pola na podstawie wejściowej tablicy.
     * 
     * @param array $options
     * @return Obiekt tej klasy.
     */
    public function setOptions(array $options) {

        $methods = get_class_methods($this);

        foreach ($options as $key => $value) {

            $method = 'set' . ucfirst($key);

            if (in_array($method, $methods)) {

                $this->$method($value);
            }
        }
        return $this;
    }
    /**
     * @brief Metoda zwracająca identyfiaktor połączenia.
     *
     * @return int 
     */
    public function getNetworkArc_id() {
        return $this->_NetworkArc_id;
    }
    /**
     * @brief Metoda ustawiająca identyfiaktor połączenia.
     *
     * @param int $_NetworkArc_id 
     */
    public function setNetworkArc_id($_NetworkArc_id) {
        $this->_NetworkArc_id = $_NetworkArc_id;
    }
    /**
     * @brief Metoda zwracająca identyfiaktor lokalizacji z której wychodzi połączenie.
     *
     * @return int 
     */
    public function getPredecessor() {
        return $this->_predecessor;
    }
    /**
     * @brief Metoda ustawiająca identyfiaktor lokalizacji z której wychodzi połączenie.
     *
     * @param int $_predecessor 
     */
    public function setPredecessor($_predecessor) {
        $this->_predecessor = $_predecessor;
    }
    /**
     * @brief Metoda zwracająca identyfiaktor lokalizacji w której kończy się połączenie.
     *
     * @return int 
     */
    public function getSuccessor() {
        return $this->_successor;
    }
    /**
     * @brief Metoda ustawiająca identyfiaktor lokalizacji w której kończy się połączenie.
     *
     * @param int $_successor 
     */
    public function setSuccessor($_successor) {
        $this->_successor = $_successor;
    }
    /**
     * @brief Metoda zwracająca nazwę lokalizacji o podanym identyfikatorze.
     *
     * @param int $id
     * @return string 
     */
    public function getNodeName($id) {
        $mapper = new Application_Model_NetworkNodeMapper();
        $node = $mapper->find($id);
        
        if(isset($node)){
            return $node->getName();
        }
        return 'Nie można uzyskać nazwy węzła';
        
    }
    /**
     * @brief Metoda zwracająca nazwę lokalizacji z której wychodzi połączenie.
     *
     * @return string
     */
    public function getPredecessorName() {
        if(!isset($this->_predecessorName)){
            $this->setPredecessorName();
        }
        return $this->_predecessorName;
    }
    /**
     * @brief Metoda ustawiającanazwę lokalizacji z której wychodzi połączenie.
     * 
     */
    public function setPredecessorName() {
        if(isset($this->_predecessor)){
            $this->_predecessorName = $this->getNodeName($this->_predecessor);
        } else {
            throw new Exception('Pusty obiekt');
        }
    }
    /**
     * @brief Metoda zwracająca nazwę lokalizacji w której kończy się połączenie.
     *
     * @return string
     */
    public function getSuccessorName() {
        if(!isset($this->_successorName)){
            $this->setSuccessorName();
        }
        return $this->_successorName;
    }
    /**
     * @brief Metoda ustawiająca nazwę lokalizacji w której kończy się połączenie.
     * 
     */
    public function setSuccessorName() {
        if(isset($this->_predecessor)){
            $this->_successorName = $this->getNodeName($this->_successor);
        } else {
            throw new Exception('Pusty obiekt');
        }
    }

}

